home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pinstaller / SimpleXMLParser.py < prev    next >
Text File  |  2006-01-22  |  4KB  |  137 lines

  1. """
  2. # Copyright 1999-2005 Gentoo Foundation
  3. # This source code is distributed under the terms of version 2 of the GNU
  4. # General Public License as published by the Free Software Foundation, a copy
  5. # of which can be found in the main directory of this project.
  6. Gentoo Linux Installer
  7.  
  8. $Id: SimpleXMLParser.py,v 1.13 2006/01/22 23:42:29 agaffney Exp $
  9.  
  10. """
  11.  
  12. import xml.sax, string
  13.  
  14. class SimpleXMLParser(xml.sax.ContentHandler):
  15.  
  16.     ##
  17.     # Brief description of function
  18.     # @param self Parameter description
  19.     # @param file=None Parameter description
  20.     def __init__(self, file=None):
  21.         self._xml_elements = []
  22.         self._xml_attrs = []
  23.         self._xml_current_data = ""
  24.         self._fntable = {}
  25.         self._path = file
  26.         self._prepass = False
  27.  
  28.     ##
  29.     # Brief description of function
  30.     # @param self Parameter description
  31.     # @param path Parameter description
  32.     # @param fn Parameter description
  33.     # @param call_on_null=False Parameter description
  34.     def addHandler(self, path, fn, call_on_null=False):
  35.         try:
  36.             self._fntable[path].append((fn,call_on_null))
  37.         except KeyError:
  38.             self._fntable[path] = [(fn, call_on_null)]
  39.  
  40.     ##
  41.     # Brief description of function
  42.     # @param self Parameter description
  43.     # @param path Parameter description
  44.     # @param fn Parameter description
  45.     def delHandler(self, path, fn):
  46.         try:
  47.             for function in self._fntable[path]:
  48.                 if function[0] == fn:
  49.                     self._fntable[path].remove(function)
  50.                     return True
  51.             return False
  52.         except KeyError:
  53.             return False
  54.  
  55.     def startElement(self, name, attr): 
  56.         """
  57.         XML SAX start element handler
  58.  
  59.         Called when the SAX parser encounters an XML openning element.
  60.         """
  61.  
  62.         self._xml_elements.append(name)
  63.         self._xml_attrs.append(attr)
  64.         self._xml_current_data = ""
  65.  
  66.     ##
  67.     # Brief description of function
  68.     # @param self Parameter description
  69.     # @param name Parameter description
  70.     def endElement(self, name):
  71.         path = self._xml_element_path()
  72.         if self._prepass:
  73.             if self._xml_elements[-2] == "include":
  74.                 if self._xml_elements[-1] == "file":
  75.                     pass
  76.                 elif self._xml_elements[-1] == "command":
  77.                     pass
  78.         if path in self._fntable.keys():
  79.             for fn in self._fntable[path]:
  80.                 if self._xml_current_data != "" or fn[1]:
  81.                     # This is being disabled since this should only apply to certain values
  82. #                    if self._xml_current_data == "True":
  83. #                        self._xml_current_data = True
  84. #                    if self._xml_current_data == "False":
  85. #                        self._xml_current_data = False
  86. #                    if self._xml_current_data == "None":
  87. #                        self._xml_current_data = None
  88.                     if self._xml_current_data.startswith("<![CDATA["):
  89.                         self._xml_current_data = self._xml_current_data[9:-5]
  90.                     else:
  91.                         self._xml_current_data = self._xml_current_data.strip()
  92.                     fn[0](path, self._xml_current_data, self._xml_attrs[-1])
  93.         # Keep the XML state
  94.         self._xml_current_data = ""
  95.         self._xml_attrs.pop()
  96.         self._xml_elements.pop()
  97.  
  98.     ##
  99.     # Brief description of function
  100.     # @param self Parameter description
  101.     # @param data Parameter description
  102.     def characters(self, data):
  103.         """
  104.         XML SAX character data handler
  105.  
  106.         Called when the SAX parser encounters character data.
  107.         """
  108.  
  109.         # This converts data to a string instead of being Unicode
  110.         # Maybe we should use Unicode strings instead of normal strings?
  111.         self._xml_current_data += str(data)
  112.  
  113.     ##
  114.     # Brief description of function
  115.     # @param self Parameter description
  116.     def _xml_element_path(self):
  117.         """
  118.         Return path to current XML node
  119.         """                
  120.         return string.join(self._xml_elements, '/')
  121.  
  122.     ##
  123.     # Brief description of function
  124.     # @param self Parameter description
  125.     # @param path=None Parameter description
  126.     def parse(self, path=None):
  127.         """
  128.         Parse serialized configuration file.
  129.         """
  130. #        self._prepass = True
  131.         if path == None and self._path == None:
  132.             raise GLIException("NoFileGiven",'fatal', 'parse', "You must specify a file to parse!")
  133.         elif path == None:       
  134.             xml.sax.parse(self._path, self)
  135.         else:
  136.             xml.sax.parse(path, self)
  137.